package com.hemerasolutions.v2trainer.service.interfaces;

import java.util.List;
import java.util.Map;

import com.hemerasolutions.v2trainer.model.exercise.Equipment;
import com.hemerasolutions.v2trainer.model.library.Library;
import com.hemerasolutions.v2trainer.model.multimedia.Photo;
import com.hemerasolutions.v2trainer.model.multimedia.Video;
import com.hemerasolutions.v2trainer.model.others.Theme;
import com.hemerasolutions.v2trainer.model.training.TrainingType;
import com.hemerasolutions.v2trainer.model.users.Academy;
import com.hemerasolutions.v2trainer.model.users.Admin;
import com.hemerasolutions.v2trainer.model.users.Athlete;
import com.hemerasolutions.v2trainer.model.users.PersonalTrainer;
import com.hemerasolutions.v2trainer.model.users.Teacher;
import com.hemerasolutions.v2trainer.model.users.User;
import com.hemerasolutions.v2trainer.service.ExceptionService;

public interface UserServiceInterface extends BaseServiceInterface{

	public abstract void deleteUser(User user) throws ExceptionService;

	public abstract User readUser(User user) throws ExceptionService;

	public abstract User createUser(User user) throws ExceptionService;

	public abstract List<Video> saveVideo(List<Video> videos) throws ExceptionService;

	public abstract Video saveVideo(Video video) throws ExceptionService;

	public abstract List<Photo> savePhoto(List<Photo> photos) throws ExceptionService;

	public abstract Photo savePhoto(Photo photo) throws ExceptionService;

	public abstract User saveUser(User user) throws ExceptionService;

	public abstract Academy readAcademy(Academy academy) throws ExceptionService;

	public abstract void deleteAcademy(Academy academy) throws ExceptionService;

	public abstract Academy saveAcademy(Academy academy) throws ExceptionService;

	public abstract Teacher createTeacher(Teacher teacher) throws ExceptionService;

	public abstract List<Teacher> createTeacher(List<Teacher> teachers) throws ExceptionService;

	public abstract Academy createAcademy(Academy academy) throws ExceptionService;

	public abstract List<Theme> listThemes()throws ExceptionService;
	
	public abstract Library readUserLibrary(String userName);

	public abstract List<Academy> searchAcademys(Map<String,Object> fields);

	public abstract Photo readDefaultWideLogo();

	public abstract Photo readDefaultLogo();

	public abstract List<Equipment> searchAcademyEquipments(Map<String, Object> fields);

	public abstract List<TrainingType> listTrainingType();

	public abstract Photo readDefaultUserPhoto();

	public abstract User getUserByUserEmail(String name);

	public abstract PersonalTrainer createPersonalTrainer(PersonalTrainer personalTrainer);

	public abstract PersonalTrainer savePersonalTrainer(PersonalTrainer personalTrainer);

	public abstract PersonalTrainer readPersonalTrainer(
			PersonalTrainer personalTrainer);

	public abstract List<PersonalTrainer> searchPersonalTrainers(
			Map<String, Object> fields);

	public abstract void deletePersonalTrainer(PersonalTrainer personalTrainer);

	public abstract Teacher saveTeacher(Teacher teacher);

	public abstract Teacher readTeacher(Teacher teacher);

	public abstract List<Teacher> searchTeachers(Map<String, Object> fields);

	public abstract void deleteTeacher(Teacher teacher) throws ExceptionService;;

	public abstract Athlete saveAthlete(Athlete athlete) throws ExceptionService;;

	public abstract Athlete createAthlete(Athlete athlete) throws ExceptionService;

	public abstract void deleteAthlete(Athlete athlete) throws ExceptionService;
	
	public abstract Athlete readAthlete(Athlete athlete);

	public abstract List<Athlete> searchAthletes(Map<String, Object> fields);

	public abstract boolean sendPassword(User userByUserName);

	public abstract Admin createAdmin(Admin admin);

	public abstract Admin saveAdmin(Admin admin);

	public abstract Admin readAdmin(Admin admin);

	public abstract void deleteAdmin(Admin admin);

	public abstract List<Admin> searchAdmins(Map<String, Object> fields);
	
	public abstract <T> T getActiveUser(User user, Class<T> type);

	Photo copyDefaultLogo();

	Photo copyDefaultWideLogo();

	Photo copyDefaultUserPhoto();


}
